package com.content.scaffold.common.utils;


import java.lang.reflect.InvocationTargetException;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;

import java.util.Map;

/**
 * @author liuyadu
 */
@Slf4j
public class BeanConvertUtils {

    public static <T> T convert(Object source, Class<T> target) {
        if (source == null) {
            return null;
        }
        T targetObject = org.springframework.beans.BeanUtils.instantiateClass(target);
        org.springframework.beans.BeanUtils.copyProperties(source, targetObject);
        return targetObject;
    }

    /**
     * 方法说明：将bean转化为另一种bean实体
     *
     * @param object      源对象，可以为null
     * @param entityClass 目标类类型
     * @return 转换后的对象，如果转换失败则返回null
     */
    public static <T> T jsonConvert(Object object, Class<T> entityClass) {
        if (object == null || entityClass == null) {
            return null;
        }

        try {
            String jsonStr = JSONUtil.toJsonStr(object);
            return JSONUtil.toBean(jsonStr, entityClass);
        } catch (Exception e) {
            log.info("JSON转换失败，源对象类型：{},目标类型：{}" ,object.getClass() , entityClass.getName(),e);
            return null;
        }
    }

    /**
     * 方法说明：将 Map 转换为指定类型的对象
     *
     * @param <T> 目标对象类型
     * @param map 包含属性值的 Map，键为 String 类型，值为 Object 类型
     * @param t   目标类的 Class 对象
     * @return 转换后的对象实例
     * @throws IllegalAccessException 如果构造实例时权限不足
     * @throws InstantiationException 如果无法创建类的实例
     * @throws InvocationTargetException 如果设置属性时发生异常
     */
    public static <T> T mapToObject(Map<String, Object> map, Class<T> t)
            throws IllegalAccessException, InstantiationException, InvocationTargetException {
        if (map == null || t == null) {
            throw new IllegalArgumentException("参数 map 和 t 都不能为 null");
        }

        try {
            T instance = t.newInstance();
            BeanUtils.populate(instance, map);
            return instance;
        } catch (Exception e) {
            // 可根据项目实际情况替换为日志框架输出
            e.printStackTrace();
            throw new InvocationTargetException(e, "将 Map 转换为对象时发生错误: " + e.getMessage());
        }
    }

    /**
     * 对象转化为 Map
     *
     * @param object 待转换对象
     * @return 转换后的 Map，失败返回 null
     */
    public static Map<?, ?> objectToMap(Object object) {
        return jsonConvert(object, Map.class);
    }


}
